package Java集合;

import org.junit.Test;
import java.util.*;

/*
     Java 集合框架概述
         面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储,另一方面,
         使用数组存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中
             数组在内存存储方面的特点
                数组初始化以后,长度就确定了
                数组声明的类型,就决定了进行元素初始化时的类型
             数组在存储数据方面的弊端
                数组初始化以后,长度就不可变了,不便于扩展
                数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高,同时无法直接获取存储元素的个数
                数组存储的数据是有序的、可以重复的,存储数据的特点单一
         Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组

     Java 集合可分为 Collection和 Map两种体系
          Collection接口:单列数据,定义了存取一组对象的方法的集合
            List:元素有序、可重复的集合
            Set:元素无序、不可重复的集合
          Map接口:双列数据,保存具有映射关系"key-value对"的集合

     Collection接口
         Collection接口是 List、Set和 Queue接口的父接口,该接口里定义的方法既可用于操作 Set集合,也可用于操作 List和 Queue集合
         JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现
         在 Java5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object类型处理,从Java5增加了泛型以后,Java集合可以记住容器中对象的数据类型

      Collection 接口方法
        添加
             add(Object obj)
             addAll(Collection coll)
        获取有效元素的个数
             int size()
        清空集合
             void clear()
        是否是空集合
             boolean isEmpty()
        是否包含某个元素:向Collection接口的实现类的对象中添加数据时,要求数据重写equals()方法
             boolean contains(Object obj):是通过元素的equals方法来判断是否是同一个对象
             boolean containsAll(Collection c):判断形参中的所有元素是否都存在于当前集合中
        删除:要求数据重写equals()方法
             boolean remove(Object obj):通过元素的equals方法判断是否是要删除的那个元素,只会删除找到的第一个元素
             boolean removeAll(Collection coll):从当前集合中移除coll中所有的元素
        取两个集合的交集
             boolean retainAll(Collection c):把交集的结果存在当前集合中,不影响c
        集合是否相等
             boolean equals(Object obj)
        转成对象数组
             Object[] toArray()
        获取集合对象的哈希值
             hashCode()
        遍历
             iterator():返回迭代器对象,用于集合遍历
 */

public class CollectionTest01 {

    @Test
    public void test1(){
        //add()
        Collection coll1 = new ArrayList();
        coll1.add("苏州大学");
        coll1.add("养天地正气,法古今完人");
        coll1.add(123);
        coll1.add(false);
        coll1.add(new Person("Tom",20));
        coll1.add(new String("Tom"));
        System.out.println(coll1.size());

        //addAll()
        Collection coll2 = new ArrayList();
        coll2.add(456);
        coll2.add("CC");
        coll1.addAll(coll2);
        System.out.println(coll1.size());

        //isEmpty()
        System.out.println(coll1.isEmpty());

        //clear():清空集合元素
        //coll1.clear();
        System.out.println(coll1.isEmpty());

        //contains():是通过元素的equals方法来判断是否是同一个对象
        System.out.println(coll1.contains(123));
        System.out.println(coll1.contains(new String("Tom")));
        System.out.println(coll1.contains(new Person("Tom",20)));

        //containsAll():判断形参中的所有元素是否都存在于当前集合中
        List<String> coll3 = Arrays.asList("123", "456");
        System.out.println(coll1.containsAll(coll2));
        System.out.println(coll1.containsAll(coll3));
    }

    //数组转集合 --> 调用Arrays的asList方法
    @Test
    public void test(){
        List<String> list = Arrays.asList(new String[]{"aa", "bb", "cc"});
        System.out.println(list);

        List<int[]> ints1 = Arrays.asList(new int[]{1, 2}); //用这种写法只会识别成一个元素
        System.out.println(ints1.size());

        List ints2 = Arrays.asList(new Integer[]{1, 2});
        System.out.println(ints2.size());
    }
}

